package main

// 移除元素
// https://leetcode.cn/problems/remove-element/?envType=study-plan-v2&envId=top-interview-150
import "fmt"

func main() {
	v := []int{0, 1, 2, 2, 3, 0, 4, 2}
	k := removeElement(v, 2)
	fmt.Println(v)
	fmt.Println(k)
}

func removeElement(nums []int, val int) int {
	left := 0
	for right, v := range nums {
		if nums[right] != val {
			nums[left] = v
			left++
		}
	}

	return left
}

//	func removeElement(nums []int, val int) int {
//		k := 0
//		for item := range nums {
//			if nums[item] == val {
//				nums[item] = '_'
//				for j := item + 1; j < len(nums); j++ {
//					if nums[j] != nums[j-1] {
//						nums[j], nums[j-1] = nums[item], nums[j]
//					}
//				}
//			} else {
//				k++
//			}
//		}
//			return k
//		}
func removeElement1(nums []int, val int) int {
	p1 := 0
	p2 := len(nums) - 1
	k := 0
	for {
		if p1 == p2 {
			if nums[p1] != val {
				k++
			}
			return k
		}

		if p1 >= len(nums) {
			return k
		}

		if p2 < 0 {
			return k
		}
		if nums[p1] == val {
			for {
				if p1 == p2 {
					return k
				}
				if nums[p2] != val {
					nums[p2], nums[p1] = nums[p1], nums[p2]
					p2--
					break
				}
				p2--
			}
		} else {
			k++
			p1++
		}
	}
}
